#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include "tagline.h"
#include "text_vector_utils.h"

//создаёт новый теглайн используя
//button_box_creator для создания горизонтального или вертикального теглайна
TagLine *new_tag_line(GtkWidget *(*button_box_creator)(void),
        void (*tag_clicked_event)(GtkObject *, gpointer)) {

    const int INIT_TAG_VECTOR_SIZE = 2;
    const int SPACING = 2;

    TagLine *tagline = (TagLine *) malloc(sizeof(TagLine));

    tagline->tag_line = button_box_creator();
    gtk_button_box_set_spacing(tagline->tag_line, SPACING);
    gtk_button_box_set_layout(GTK_BUTTON_BOX(tagline->tag_line),
            GTK_BUTTONBOX_START);
    gtk_widget_show(tagline->tag_line);

    tagline->tag_vector = alloc_text_vector(INIT_TAG_VECTOR_SIZE);
    tagline->tag_vector[0] = NULL;
    tagline->tag_vector_size = INIT_TAG_VECTOR_SIZE;

    tagline->tag_count = 0;

    tagline->tag_clicked_event = tag_clicked_event;

    return tagline;
}

//создаёт теглайн с вертикальным расположением тегов
TagLine *new_vtag_line(void (*tag_clicked_event)(GtkObject *, gpointer)) {
    return new_tag_line(gtk_vbutton_box_new, tag_clicked_event);
}

//создаёт теглайн с горизонтальным расположением тегов
TagLine *new_htag_line(void (*tag_clicked_event)(GtkObject *, gpointer)) {
    return new_tag_line(gtk_hbutton_box_new, tag_clicked_event);
}

//добавляет в теглайн тег с именем tag
void add_to_tagline(TagLine *tagline, const char *tag) {
    char *tag_name = strcpy((char *) malloc(sizeof(char) * strlen(tag)), tag);
    GtkWidget *tag_button = gtk_button_new_with_label((gchar *) (tag_name));
    //при нажатии на тег вызывается соответствующая функция tag_clicked_event
    gtk_signal_connect(GTK_OBJECT(tag_button),
            "clicked",
            GTK_SIGNAL_FUNC(tagline->tag_clicked_event),
            (gpointer) tag_name);

    gtk_container_add(GTK_CONTAINER(tagline->tag_line), tag_button);
    gtk_widget_show(tag_button);

    if(tagline->tag_count >= tagline->tag_vector_size - 1) {
        expand_text_vector(&(tagline->tag_vector),
                &(tagline->tag_vector_size),
                (tagline->tag_vector_size * 2));
    }

    tagline->tag_vector[tagline->tag_count] = tag_name;
    tagline->tag_vector[tagline->tag_count + 1] = NULL;
    tagline->tag_count++;
}

//добавляет теги из вектора tagsv
void add_tags_to_tagline(TagLine *tagline, char **tagsv) {
    int i;
    for(i = 0; tagsv[i] != NULL; i++) {
        add_to_tagline(tagline, tagsv[i]);
    }
}

